using UnityEngine;
using System.Collections;

public class AudioMouthController : MonoBehaviour
{
    public SkinnedMeshRenderer meshRenderer; // 角色的 SkinnedMeshRenderer 组件，用于控制面部表情
    public int blendShapeIndex; // 目标 blendshape 的索引，用于控制嘴巴的表情
    public float blendWeightMultiplier = 100f; // 调节 blendshape 权重的倍数，控制嘴巴表情的强度
    public float smoothTime = 0.1f; // 平滑时间，控制嘴巴表情变化的平滑度

    [SerializeField] private AudioSource audioSource; // 音频源，用于获取音频数据

    private float blendWeight; // 当前的 blendshape 权重
    private float blendWeightVelocity; // 记录 blendshape 权重的变化速度，用于平滑变化

    void Update()
    {
        // 如果音频正在播放，则根据音频的幅度动态调整嘴巴的表情
        if (audioSource.isPlaying)
        {
            float amplitude = GetAmplitude(); // 获取当前音频的幅度（音量）
            // 平滑变化的权重，使用 SmoothDamp 方法控制变化过程的平滑度
            blendWeight = Mathf.SmoothDamp(blendWeight, amplitude * blendWeightMultiplier, ref blendWeightVelocity, smoothTime);
            // 设置 blendshape 权重，根据音频幅度调整嘴巴的表情
            meshRenderer.SetBlendShapeWeight(blendShapeIndex, blendWeight);
        }
        else
        {
            // 如果音频停止播放，逐渐将嘴巴表情权重平滑恢复为 0
            blendWeight = Mathf.SmoothDamp(blendWeight, 0f, ref blendWeightVelocity, smoothTime);
            // 设置 blendshape 权重为 0，恢复正常状态
            meshRenderer.SetBlendShapeWeight(blendShapeIndex, blendWeight);
        }
    }

    // 获取当前音频的幅度（音量）
    float GetAmplitude()
    {
        // 创建一个 512 长度的数组，用来存储音频数据
        float[] samples = new float[512];
        // 获取音频源的输出数据（即音频样本数据）
        audioSource.GetOutputData(samples, 0);

        float sum = 0f;
        // 遍历样本数据，累加每个样本的绝对值
        for (int i = 0; i < samples.Length; i++)
        {
            sum += Mathf.Abs(samples[i]);
        }
        // 返回平均幅度（即音频的音量）
        return sum / samples.Length;
    }
    
}